﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HS.Domain.EF;
using System.Data.Entity;

namespace HS.Business.Security
{
    public class PromocionBusiness
    {
        public bool Create(Promocion model) {
            try
            {
                using (var context = new HomeSolutionsDBEntities())
                {
                    context.Promocion.Add(model);
                    context.SaveChanges();
                }

                return true;
            }
            catch
            {
                return false;
            }
        }

        public bool Edit(Promocion model, int promocionId) {
            try
            {
                //var obj = GetEntityByPK(promocionId);
                
                using (var context = new HomeSolutionsDBEntities()) {
                    var dbset = context.Set<Promocion>();
                    var item = dbset.Find(model.IdPromocion);
                    ////context.Promocion.Attach(model);
                    //item = model;
                    //var entry = context.Entry(model);
                    ////entry.State = System.Data.EntityState.Modified;
                    
                    ////dbset.Attach(model);
                    //var item = dbset.Find(model.IdPromocion);
                    //item = model;
                    //var entry = context.Entry<Promocion>(model);
                    
                    if (item != null)
                    {
                        //item.IdPromocion = model.IdPromocion;
                        item.Codigo = model.Codigo;
                        item.Nombre = model.Nombre;
                        item.Descripcion = model.Descripcion;
                        item.FechaInicio = model.FechaInicio;
                        item.HoraInicio = model.HoraInicio;
                        item.FechaTermino = model.FechaTermino;
                        item.HoraTermino = model.HoraTermino;
                        item.IdEstadoGeneral = model.IdEstadoGeneral;
                        item.EsVigente = model.EsVigente;
                        item.Opciones = model.Opciones;
                        item.Prioridad = model.Prioridad;
                        item.EsAcumulable = model.EsAcumulable;
                        item.IdCampania = model.IdCampania;
                        item.RowStatus = model.RowStatus;
                        item.Condiciones = model.Condiciones;
                        item.Beneficios = model.Beneficios;
                        context.SaveChanges();
                    }

                }

                return true;
            }
            catch
            {
                return false; 
            }
        }

        public Promocion GetEntityByPK(int? id, bool? rowStatus) {
            HomeSolutionsDBEntities context = new HomeSolutionsDBEntities();

            Promocion obj = context.Promocion
                                .Include(p => p.Condiciones)
                                .Include(p => p.Beneficios)
                                .Where(p => p.IdPromocion == id
                                         && (rowStatus != null ? p.RowStatus == rowStatus : p.RowStatus == true))
                                .FirstOrDefault();

            obj.RowStatus = true;

            return obj;
        }

        public List<Promocion> GetEntities(string codigo, string descripcion, int? estadoGeneral, string fechaInicio, string fechaTermino, bool? esVigente, bool? rowStatus)
        {
            HomeSolutionsDBEntities context = new HomeSolutionsDBEntities();

            List<Promocion> list = new List<Promocion>();

            if (string.IsNullOrEmpty(fechaInicio))
            {
                if (string.IsNullOrEmpty(fechaTermino))
                {
                    list = context.Promocion
                                  .Where(p => p.Codigo.Contains(codigo.Trim())
                                           && p.Descripcion.Contains(descripcion.Trim())
                                           && p.IdEstadoGeneral == estadoGeneral
                                           && (esVigente != null ? p.EsVigente == esVigente : p.EsVigente == true)
                                           && (rowStatus != null ? p.RowStatus == rowStatus : p.RowStatus == true))
                                  .ToList();
                }
                else
                {
                    var fTermino = DateTime.Parse(fechaTermino).Date;

                    list = context.Promocion
                                  .Where(p => p.Codigo.Contains(codigo.Trim())
                                           && p.Descripcion.Contains(descripcion.Trim())
                                           && p.IdEstadoGeneral == estadoGeneral
                                           && p.FechaTermino.Value <= fTermino
                                           && (esVigente != null ? p.EsVigente == esVigente : p.EsVigente == true)
                                           && (rowStatus != null ? p.RowStatus == rowStatus : p.RowStatus == true))
                                  .ToList();
                }
            }
            else
            {
                if (string.IsNullOrEmpty(fechaTermino))
                {
                    var fInicio = DateTime.Parse(fechaInicio);

                    list = context.Promocion
                                  .Where(p => p.Codigo.Contains(codigo)
                                           && p.Descripcion.Contains(descripcion)
                                           && p.IdEstadoGeneral == estadoGeneral
                                           && p.FechaInicio.Value >= fInicio
                                           && (esVigente != null ? p.EsVigente == esVigente : p.EsVigente == true)
                                           && (rowStatus != null ? p.RowStatus == rowStatus : p.RowStatus == true))
                                  .ToList();
                }
                else
                {
                    var finicio = DateTime.Parse(fechaInicio);
                    var fTermino = DateTime.Parse(fechaTermino);

                    list = context.Promocion
                                  .Where(p => p.Codigo.Contains(codigo.Trim())
                                           && p.Descripcion.Contains(descripcion.Trim())
                                           && p.IdEstadoGeneral == estadoGeneral
                                           && p.FechaInicio.Value >= finicio
                                           && p.FechaTermino.Value <= fTermino
                                           && (esVigente != null ? p.EsVigente == esVigente : p.EsVigente == true)
                                           && (rowStatus != null ? p.RowStatus == rowStatus : p.RowStatus == true))
                                  .ToList();
                }
            }

            return list;
        }

        public int GetMaxCodigo()
        {
            HomeSolutionsDBEntities context = new HomeSolutionsDBEntities();

            return Convert.ToInt32(context.Promocion
                    .Max(p => p.Codigo));
        }
    }
}
